
package com.zany.util.BeansUtil;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

/***************************************************************************************************
 * BeanUtil 需要核心方法
 ***************************************************************************************************/
public class BeanInfoUtil {
/***************************
 * @param obj   获得对象的类型
 ***************************/
	public static Class getClass(Object obj)throws Exception{
		try{
			return obj.getClass();
		}catch(Exception ae){
			throw new Exception("获得对象类型出错!");
		}
	}
/***************************
 * 通过类型获得对象的类信息
 ***************************/
	public static BeanInfo getBeanInfo(Class clazz) throws Exception{
		try{
			return Introspector.getBeanInfo(clazz);
		}catch(Exception e){
			throw new Exception("获得BEAN类信息出错！");
		}
	}
/***************************
 * 通过对象获得对象的类信息
 ***************************/
	public static BeanInfo getBeanInfo(Object obj) throws Exception{
		try{
			return BeanInfoUtil.getBeanInfo(obj.getClass());
		}catch(Exception e){
			throw new Exception("获得BEAN类信息出错！");
		}
	}
/***************************
 * 通过类型获得类的所有属性集合
 ***************************/
	public static PropertyDescriptor[] getPropertyDescriptors(Class clazz) throws Exception{
		try{
			return BeanInfoUtil.getBeanInfo(clazz).getPropertyDescriptors();
		}catch(Exception e){
			throw new Exception("获得BEAN类属性信息集合出错！");
		}
	}
/***************************
 * 通过对象获得类的所有属性集合
 ***************************/
	public static PropertyDescriptor[] getPropertyDescriptors(Object obj) throws Exception{
		try{
			return BeanInfoUtil.getPropertyDescriptors(obj.getClass());
		}catch(Exception e){
			throw new Exception("获得BEAN类属性信息集合出错！");
		}
	}
/***************************
 * 通过BeanInfo获得类的所有属性集合
 ***************************/
	public static PropertyDescriptor[] getPropertyDescriptors(BeanInfo beanInfo) throws Exception{
		try{
			return beanInfo.getPropertyDescriptors();
		}catch(Exception e){
			throw new Exception("获得BEAN类属性信息集合出错！");
		}
	}
/***************************
 * 获得BEAN属性的名称
 ***************************/
	public static String getName(PropertyDescriptor props) throws Exception{
		try{
			return props.getName();
		}catch(Exception e){
			throw new Exception("获得BEAN属性的名称出错！");
		}
	}
/***************************
 * 获得BEAN属性的类型
 ***************************/
	public static Class getPropertyType(PropertyDescriptor props) throws Exception{
		try{
			return props.getPropertyType();
		}catch(Exception e){
			throw new Exception("获得BEAN属性的类型出错！");
		}
	}
/***************************
 * 获得BEAN属性的get方法 
 ***************************/
	public static Method getReadMethod(PropertyDescriptor props) throws Exception{
		try{
			return props.getReadMethod();
		}catch(Exception e){
			throw new Exception("获得BEAN属性的get方法出错！");
		}
	}	
/***************************
 * 获得BEAN属性的set方法 
 ***************************/
	public static Method getWriteMethod(PropertyDescriptor props) throws Exception{
		try{
			return props.getWriteMethod();
		}catch(Exception e){
			throw new Exception("获得BEAN属性的set方法出错！");
		}
	}
/*************************************
 * 判断属性名是否是类内部属性 假表示是内部属性
 *************************************/
	public static boolean rightName(PropertyDescriptor props) throws Exception{
		try{
			if(!(("class".equals(props.getName())
			||"multipartRequestHandler".equals(props.getName())
			||"servlet".equals(props.getName())
			||"servletWrapper".equals(props.getName())))){
				return true;
			}return false;
		}catch(Exception e){
			throw new Exception("判断属性名是否是类内部属性出错！");
		}
	}
/*************************************
 * 获得属性的参数类型集合
 *************************************/
	public static Class[] getParameterTypes(PropertyDescriptor props)throws Exception{
		try{
			return props.getWriteMethod().getParameterTypes();
		}catch(Exception e){
			throw new Exception("获得属性的参数类型集合出错！");
		}
	}
/*************************************
 * 获得属性的返回类型
 *************************************/
	public static Class getReturnType(PropertyDescriptor props)throws Exception{
		try{
			return props.getReadMethod().getReturnType();
		}catch(Exception e){
			throw new Exception("获得属性的返回类型出错！");
		}
	}
/*************************************
 * 获得属性的返回类型名称
 *************************************/
	public static String getTypeName(PropertyDescriptor props)throws Exception{
		try{
			return props.getReadMethod().getReturnType().getName();
		}catch(Exception e){
			throw new Exception("获得属性的返回类型名称出错！");
		}
	}
/*************************************
 * 获得属性的值
 *************************************/
	public static Object getValue(PropertyDescriptor props,Object obj)throws Exception{
		try{
			return props.getReadMethod().invoke(obj,null);
		}catch(Exception e){
			throw new Exception("获得属性的值出错！");
		}
	}
}
